home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
HPAVC
/
HPAVC CD-ROM.iso
/
MOR55SRC.ZIP
/
MORIA
/
SOURCE
/
FILES.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-12-07
|
16KB
|
561 lines
/* source/files.c: misc code to access files used by Moria
Copyright (c) 1989-92 James E. Wilson, Robert A. Koeneke
This software may be copied and distributed for educational, research, and
not for profit purposes provided that this copyright and statement are
included in all such copies. */
#include <stdio.h>
#ifndef STDIO_LOADED
#define STDIO_LOADED
#endif
#if 0
/* moved to externs.h to avoid VMS 'psect' problem */
#include <errno.h>
#endif
#ifdef __TURBOC__
#include <io.h>
#include <stdlib.h>
#endif /* __TURBOC__ */
#include "config.h"
#include "constant.h"
#include "types.h"
#if defined(GEMDOS) && (__STDC__ == 0) && !defined(ATARIST_TC)
#include <access.h>
char *strcat();
#endif
#ifdef VMS
#include <string.h>
#include <file.h>
#else
#ifdef USG
#ifndef ATARIST_MWC
#include <string.h>
#ifndef ATARIST_TC
#include <fcntl.h>
#endif
#endif
#else
#include <strings.h>
#include <sys/file.h>
#endif
#if defined(ultrix) || defined(USG)
void exit();
#endif
#endif
/* This must be included after fcntl.h, which has a prototype for `open'
on some systems. Otherwise, the `open' prototype conflicts with the
`topen' declaration. */
#include "externs.h"
#ifdef ATARIST_TC
/* Include this to get prototypes for standard library functions. */
#include <stdlib.h>
#endif
#ifdef MAC
#include "ScrnMgr.h"
#define GNRL_ALRT 1024
#endif
/*
* init_scorefile
* Open the score file while we still have the setuid privileges. Later
* when the score is being written out, you must be sure to flock the file
* so we don't have multiple people trying to write to it at the same time.
* Craig Norborg (doc) Mon Aug 10 16:41:59 EST 1987
*/
void init_scorefile()
{
#ifdef MAC
appldirectory ();
#endif
#if defined(atarist) || defined(ATARI_ST) || defined(MAC)
highscore_fp = fopen(MORIA_TOP, "rb+");
#else
highscore_fp = fopen(MORIA_TOP, "r+");
#endif
if (highscore_fp == NULL)
{
#ifdef MAC
highscore_fp = fopen (MORIA_TOP, "wb"); /* Create it if not there. */
if (highscore_fp == NULL)
{
ParamText ("\pCan't create score file!", NULL, NULL, NULL);
DoScreenALRT (GNRL_ALRT, akStop, fixHalf, fixThird);
ExitToShell ();
}
setfileinfo (MORIA_TOP, currentdirectory (), SCORE_FTYPE);
#else
(void) fprintf (stderr, "Can't open score file \"%s\"\n", MORIA_TOP);
exit(1);
#endif
}
#if defined(MSDOS) || defined(VMS) || defined(MAC)
/* can't leave it open, since this causes problems on networked PCs and VMS,
we DO want to check to make sure we can open the file, though */
fclose (highscore_fp);
#endif
#ifdef MAC
restoredirectory ();
#endif
}
#ifndef MAC
/* Attempt to open the intro file -RAK- */
/* This routine also checks the hours file vs. what time it is -Doc */
void read_times()
{
vtype in_line;
register int i;
FILE *file1;
#ifdef MORIA_HOU
/* Attempt to read hours.dat. If it does not exist, */
/* inform the user so he can tell the wizard about it */
if ((file1 = fopen(MORIA_HOU, "r")) != NULL)
{
while (fgets(in_line, 80, file1) != CNIL)
if (strlen(in_line) > 3)
{
if (!strncmp(in_line, "SUN:", 4))
(void) strcpy(days[0], in_line);
else if (!strncmp(in_line, "MON:", 4))
(void) strcpy(days[1], in_line);
else if (!strncmp(in_line, "TUE:", 4))
(void) strcpy(days[2], in_line);
else if (!strncmp(in_line, "WED:", 4))
(void) strcpy(days[3], in_line);
else if (!strncmp(in_line, "THU:", 4))
(void) strcpy(days[4], in_line);
else if (!strncmp(in_line, "FRI:", 4))
(void) strcpy(days[5], in_line);
else if (!strncmp(in_line, "SAT:", 4))
(void) strcpy(days[6], in_line);
}
(void) fclose(file1);
}
else
{
restore_term();
(void) fprintf(stderr, "There is no hours file \"%s\".\n", MORIA_HOU);
(void) fprintf(stderr, "Please inform the wizard, %s, so he ", WIZARD);
(void) fprintf(stderr, "can correct this!\n");
exit(1);
}
/* Check the hours, if closed then exit. */
if (!check_time())
{
if ((file1 = fopen(MORIA_HOU, "r")) != NULL)
{
clear_screen();
#ifdef VMS
restore_screen();
#endif
for (i = 0; fgets(in_line, 80, file1) != CNIL; i++)
put_buffer(in_line, i, 0);
pause_line (23);
(void) fclose(file1);
}
exit_game();
}
#endif
/* Print the introduction message, news, etc. */
if ((file1 = fopen(MORIA_MOR, "r")) != NULL)
{
clear_screen();
#ifdef VMS
restore_screen();
#endif
for (i = 0; fgets(in_line, 80, file1) != CNIL; i++)
put_buffer(in_line, i, 0);
pause_line(23);
(void) fclose(file1);
}
}
#endif
/* File perusal. -CJS-
primitive, but portable */
void helpfile(filename)
char *filename;
#ifdef MAC
{
mac_helpfile(filename, TRUE);
}
#else
{
bigvtype tmp_str;
FILE *file;
char input;
int i;
file = fopen(filename, "r");
if (file == NULL)
{
(void) sprintf (tmp_str, "Can not find help file \"%s\".\n", filename);
prt (tmp_str, 0, 0);
return;
}
save_screen();
while (!feof(file))
{
clear_screen();
for (i = 0; i < 23; i++)
if (fgets (tmp_str, BIGVTYPESIZ-1, file) != CNIL)
put_buffer (tmp_str, i, 0);
prt("[Press any key to continue.]", 23, 23);
input = inkey();
if (input == ESCAPE)
break;
}
(void) fclose(file);
restore_screen();
}
#endif
/* Prints a list of random objects to a file. Note that -RAK- */
/* the objects produced is a sampling of objects which */
/* be expected to appear on that level. */
void print_objects()
{
register int i;
int nobj, j, level;
vtype filename1; bigvtype tmp_str;
register FILE *file1;
register inven_type *i_ptr;
#ifdef MAC
short vrefnum;
#endif
#ifdef ATARIST_MWC
int32u holder;
#endif
prt("Produce objects on what level?: ", 0, 0);
level = 0;
if (!get_string(tmp_str, 0, 32, 10))
return;
level = atoi(tmp_str);
prt("Produce how many objects?: ", 0, 0);
nobj = 0;
if (!get_string(tmp_str, 0, 27, 10))
return;
nobj = atoi(tmp_str);
if ((nobj > 0) && (level > -1) && (level < 1201))
{
if (nobj > 10000)
nobj = 10000;
#ifdef MAC
(void) strcpy(filename1, "Objects");
if (doputfile("Save objects in:", filename1, &vrefnum))
#else
prt("File name: ", 0, 0);
if (get_string(filename1, 0, 11, 64))
#endif
{
if (strlen(filename1) == 0)
return;
#ifdef MAC
changedirectory(vrefnum);
#endif
if ((file1 = fopen(filename1, "w")) != NULL)
{
#ifdef MAC
macbeginwait ();
#endif
(void) sprintf(tmp_str, "%d", nobj);
prt(strcat(tmp_str, " random objects being produced..."), 0, 0);
put_qio();
(void) fprintf(file1, "*** Random Object Sampling:\n");
(void) fprintf(file1, "*** %d objects\n", nobj);
(void) fprintf(file1, "*** For Level %d\n", level);
(void) fprintf(file1, "\n");
(void) fprintf(file1, "\n");
j = popt();
for (i = 0; i < nobj; i++)
{
invcopy(&t_list[j], sorted_objects[get_obj_num(level)]);
magic_treasure(j, level);
i_ptr = &t_list[j];
store_bought(i_ptr);
#ifdef ATARIST_MWC
if (i_ptr->flags & (holder = TR_CURSED))
#else
if (i_ptr->flags & TR_CURSED)
#endif
add_inscribe(i_ptr, ID_DAMD);
objdes(tmp_str, i_ptr, TRUE);
(void) fprintf(file1, "%d %s\n", i_ptr->level, tmp_str);
}
pusht((int8u)j);
(void) fclose(file1);
#ifdef MAC
setfileinfo(filename1, vrefnum, INFO_FTYPE);
macendwait ();
#endif
prt("Completed.", 0, 0);
}
else
prt("File could not be opened.", 0, 0);
#ifdef MAC
restoredirectory();
#endif
}
}
else
prt ("Parameters no good.", 0, 0);
}
/* Print the character to a file or device -RAK- */
#ifdef MAC
int file_character()
#else
int file_character(filename1)
char *filename1;
#endif
{
register int i;
int j, xbth, xbthb, xfos, xsrh, xstl, xdis, xsave, xdev;
vtype xinfra;
int fd;
register FILE *file1;
bigvtype prt2;
register struct misc *p_ptr;
register inven_type *i_ptr;
vtype out_val, prt1;
char *p, *colon, *blank;
#ifdef MAC
vtype filename1;
short vrefnum;
#endif
#ifdef MAC
(void) makefilename(filename1, "Stats", TRUE);
if (!doputfile("Save character description in:", filename1, &vrefnum))
return (FALSE);
#endif
#ifndef VMS
/* VMS creates a new version of a file, so no need to check for rewrite. */
#ifdef MAC
changedirectory(vrefnum);
fd = open (filename1, O_WRONLY|O_CREAT|O_TRUNC);
restoredirectory();
macbeginwait ();
#else
#if defined(GEMDOS) && (__STDC__ == 0) && !defined(ATARIST_TC)
if (!access(filename1, AREAD))
{
(void) sprintf(out_val, "Replace existing file %s?", filename1);
if (get_check(out_val))
fd = creat(filename1, 1);
}
else
fd = creat (filename1, 1);
#else
fd = open (filename1, O_WRONLY|O_CREAT|O_EXCL, 0644);
if (fd < 0 && errno == EEXIST)
{
(void) sprintf(out_val, "Replace existing file %s?", filename1);
if (get_check(out_val))
fd = open(filename1, O_WRONLY, 0644);
}
#endif
#endif
if (fd >= 0)
{
/* on some non-unix machines, fdopen() is not reliable, hence must call
close() and then fopen() */
(void) close(fd);
file1 = fopen(filename1, "w");
}
else
file1 = NULL;
#else /* VMS */
fd = -1;
file1 = fopen (filename1, "w");
#endif
if (file1 != NULL)
{
prt("Writing character sheet...", 0, 0);
put_qio();
colon = ":";
blank = " ";
#ifdef MAC
(void) fprintf(file1, "\n\n");
#else
(void) fprintf(file1, "%c\n\n", CTRL('L'));
#endif
(void) fprintf(file1, " Name%9s %-23s", colon, py.misc.name);
(void) fprintf(file1, " Age%11s %6d", colon, (int)py.misc.age);
cnv_stat(py.stats.use_stat[A_STR], prt1);
(void) fprintf(file1, " STR : %s\n", prt1);
(void) fprintf(file1, " Race%9s %-23s", colon,
race[py.misc.prace].trace);
(void) fprintf(file1, " Height%8s %6d", colon, (int)py.misc.ht);
cnv_stat(py.stats.use_stat[A_INT], prt1);
(void) fprintf(file1, " INT : %s\n", prt1);
(void) fprintf(file1, " Sex%10s %-23s", colon,
(py.misc.male ? "Male" : "Female"));
(void) fprintf(file1, " Weight%8s %6d", colon, (int)py.misc.wt);
cnv_stat(py.stats.use_stat[A_WIS], prt1);
(void) fprintf(file1, " WIS : %s\n", prt1);
(void) fprintf(file1, " Class%8s %-23s", colon,
class[py.misc.pclass].title);
(void) fprintf(file1, " Social Class : %6d", py.misc.sc);
cnv_stat(py.stats.use_stat[A_DEX], prt1);
(void) fprintf(file1, " DEX : %s\n", prt1);
(void) fprintf(file1, " Title%8s %-23s", colon, title_string());
(void) fprintf(file1, "%22s", blank);
cnv_stat(py.stats.use_stat[A_CON], prt1);
(void) fprintf(file1, " CON : %s\n", prt1);
(void) fprintf(file1, "%34s", blank);
(void) fprintf(file1, "%26s", blank);
cnv_stat(py.stats.use_stat[A_CHR], prt1);
(void) fprintf(file1, " CHR : %s\n\n", prt1);
(void) fprintf(file1, " + To Hit : %6d", py.misc.dis_th);
(void) fprintf(file1, "%8sLevel : %6d", blank, (int)py.misc.lev);
(void) fprintf(file1, " Max Hit Points : %6d\n", py.misc.mhp);
(void) fprintf(file1, " + To Damage : %6d", py.misc.dis_td);
(void) fprintf(file1, "%8sExperience : %6ld", blank, py.misc.exp);
(void) fprintf(file1, " Cur Hit Points : %6d\n", py.misc.chp);
(void) fprintf(file1, " + To AC : %6d", py.misc.dis_tac);
(void) fprintf(file1, "%8sMax Exp : %6ld", blank, py.misc.max_exp);
(void) fprintf(file1, " Max Mana%8s %6d\n", colon, py.misc.mana);
(void) fprintf(file1, " Total AC : %6d", py.misc.dis_ac);
if (py.misc.lev == MAX_PLAYER_LEVEL)
(void) fprintf (file1, "%8sExp to Adv : ******", blank);
else
(void) fprintf(file1, "%8sExp to Adv : %6ld", blank,
(int32)(player_exp[py.misc.lev-1]
* py.misc.expfact / 100));
(void) fprintf(file1, " Cur Mana%8s %6d\n", colon, py.misc.cmana);
(void) fprintf(file1, "%29sGold%8s %6ld\n\n", blank, colon,
py.misc.au);
p_ptr = &py.misc;
xbth = p_ptr->bth + p_ptr->ptohit * BTH_PLUS_ADJ
+ (class_level_adj[p_ptr->pclass][CLA_BTH] * p_ptr->lev);
xbthb = p_ptr->bthb + p_ptr->ptohit * BTH_PLUS_ADJ
+ (class_level_adj[p_ptr->pclass][CLA_BTHB] * p_ptr->lev);
/* this results in a range from 0 to 29 */
xfos = 40 - p_ptr->fos;
if (xfos < 0)
xfos = 0;
xsrh = p_ptr->srh;
/* this results in a range from 0 to 9 */
xstl = p_ptr->stl + 1;
xdis = p_ptr->disarm + 2 * todis_adj() + stat_adj(A_INT)
+ (class_level_adj[p_ptr->pclass][CLA_DISARM] * p_ptr->lev / 3);
xsave = p_ptr->save + stat_adj(A_WIS)
+ (class_level_adj[p_ptr->pclass][CLA_SAVE] * p_ptr->lev / 3);
xdev = p_ptr->save + stat_adj(A_INT)
+ (class_level_adj[p_ptr->pclass][CLA_DEVICE] * p_ptr->lev / 3);
(void) sprintf(xinfra, "%d feet", py.flags.see_infra * 10);
(void) fprintf(file1, "(Miscellaneous Abilities)\n\n");
(void) fprintf(file1, " Fighting : %-10s", likert(xbth, 12));
(void) fprintf(file1, " Stealth : %-10s", likert(xstl, 1));
(void) fprintf(file1, " Perception : %s\n", likert(xfos, 3));
(void) fprintf(file1, " Bows/Throw : %-10s", likert(xbthb, 12));
(void) fprintf(file1, " Disarming : %-10s", likert(xdis, 8));
(void) fprintf(file1, " Searching : %s\n", likert(xsrh, 6));
(void) fprintf(file1, " Saving Throw: %-10s", likert(xsave, 6));
(void) fprintf(file1, " Magic Device: %-10s", likert(xdev, 6));
(void) fprintf(file1, " Infra-Vision: %s\n\n", xinfra);
/* Write out the character's history */
(void) fprintf(file1, "Character Background\n");
for (i = 0; i < 4; i++)
(void) fprintf(file1, " %s\n", py.misc.history[i]);
/* Write out the equipment list. */
j = 0;
(void) fprintf(file1, "\n [Character's Equipment List]\n\n");
if (equip_ctr == 0)
(void) fprintf(file1, " Character has no equipment in use.\n");
else
for (i = INVEN_WIELD; i < INVEN_ARRAY_SIZE; i++)
{
i_ptr = &inventory[i];
if (i_ptr->tval != TV_NOTHING)
{
switch (i)
{
case INVEN_WIELD: p = "You are wielding"; break;
case INVEN_HEAD: p = "Worn on head"; break;
case INVEN_NECK: p = "Worn around neck"; break;
case INVEN_BODY: p = "Worn on body"; break;
case INVEN_ARM: p = "Worn on shield arm";break;
case INVEN_HANDS: p = "Worn on hands"; break;
case INVEN_RIGHT: p = "Right ring finger";break;
case INVEN_LEFT: p = "Left ring finger";break;
case INVEN_FEET: p = "Worn on feet"; break;
case INVEN_OUTER: p = "Worn about body"; break;
case INVEN_LIGHT: p = "Light source is"; break;
case INVEN_AUX: p = "Secondary weapon"; break;
default: p = "*Unknown value*"; break;
}
objdes(prt2, &inventory[i], TRUE);
(void) fprintf(file1, " %c) %-19s: %s\n", j+'a', p, prt2);
j++;
}
}
/* Write out the character's inventory. */
#ifdef MAC
(void) fprintf(file1, "\n\n");
#else
(void) fprintf(file1, "%c\n\n", CTRL('L'));
#endif
(void) fprintf(file1, " [General Inventory List]\n\n");
if (inven_ctr == 0)
(void) fprintf(file1, " Character has no objects in inventory.\n");
else
{
for (i = 0; i < inven_ctr; i++)
{
objdes(prt2, &inventory[i], TRUE);
(void) fprintf(file1, "%c) %s\n", i+'a', prt2);
}
}
#ifndef MAC
(void) fprintf(file1, "%c", CTRL('L'));
#endif
(void) fclose(file1);
#ifdef MAC
setfileinfo(filename1, vrefnum, INFO_FTYPE);
macendwait ();
#endif
prt("Completed.", 0, 0);
return TRUE;
}
else
{
if (fd >= 0)
(void) close (fd);
(void) sprintf (out_val, "Can't open file %s:", filename1);
msg_print(out_val);
return FALSE;
}
}